﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Chainsaw.Interfaces;

namespace ErepIrcBot
{
    public abstract class Komenda
    {

        public Plugin plugin;

        protected string nazwa;
        protected string opis;
        protected string parametry;
        protected int poziom;

        protected static System.Object lockWyswietlanie = new System.Object();

        protected static long czas = DateTime.Now.Ticks;
        protected static long czas2 = DateTime.Now.Ticks;

        protected static int licznikWyswietlen = 0;

        protected static int licznikWyswietlen2 = 0;

        public Komenda(Plugin plugin)
        {
            this.plugin = plugin;
        }

        private int ticksToMiliseconds(long ticks)
        {
            long milisekundy = ticks / 10000L;
            return (int) milisekundy;
        }

        private void czekaj(ref int licznik, ref long czas, int czasCzekania, int ile)
        {
            ++licznik;
            if (licznik > ile)
            {
                long teraz = DateTime.Now.Ticks;
                long roznica = teraz - czas;
                int roznicaMili = ticksToMiliseconds(roznica);
                if (roznicaMili < czasCzekania)
                {
                    Thread.Sleep(czasCzekania - roznicaMili);
                }
                licznik = 0;
                czas = DateTime.Now.Ticks;
            }
        }

        protected void wyswietlTekst(string gdzie, string tekst, bool bold = true)
        {
            lock (lockWyswietlanie)
            {
                czekaj(ref licznikWyswietlen, ref czas, 6000, 3);
                czekaj(ref licznikWyswietlen2, ref czas2, 28000, 7);
                string komenda = "bot_say " + gdzie + " " + ((bold) ? Convert.ToChar(2).ToString() : "") + tekst;
                plugin.przeslijDoBota(komenda);
            }
            
        }

        public void zarejestrujKomende()
        {
            string tekst =
                "bind_add !" + nazwa + " bot_noop " + poziom + " \"" + parametry + "\" \"" + opis + "\"";
            plugin.przeslijDoBota(tekst);
        }

        public void usunKomende()
        {
            string komenda = "bind_del !" + nazwa;
            plugin.przeslijDoBota(komenda);
        }

        public void wykonajKomende(string tekst, string channel, int userLevel, string nick = "")
        {
            if (czyWarunek(tekst, channel, userLevel, nick))
                wykonajInternal(tekst, channel, nick, userLevel);
        }

        protected virtual bool czyWarunek(string tekst, string channel, int userLevel, string nick)
        {
            return tekst.StartsWith("!" + nazwa) && !String.IsNullOrEmpty(channel) && userLevel >= poziom;
        }

        protected abstract void wykonajInternal(string tekst, string channel, string nick, int userLevel=0);

        protected void wyswietlGdzieTrzeba(string napis, string channel, string nick, bool bold=true)
        {
            if (!String.IsNullOrEmpty(channel))
                wyswietlTekst(channel, napis, bold);
            else if (!String.IsNullOrEmpty(nick))
                wyswietlTekst(nick, napis, bold);
        }
    }
}
